www.gusucode.com > matlab最优化程序源码---书籍 > matlab最优化程序/光盘程序/第11章 整数规划/IntProgFZ.m

    function [x,fm] = IntProgFZ(f,A,b,Aeq,beq,lb,ub)
x = NaN;
fm = NaN;
NF_lb = zeros(size(lb));
NF_ub = zeros(size(ub)); 
NF_lb(:,1) = lb;
NF_ub(:,1) = ub;
F = inf;

while 1
    sz = size(NF_lb);
    k = sz(2);
    opt = optimset('TolX',1e-9);
    [xm,fv,exitflag] = linprog(f,A,b,Aeq,beq,NF_lb(:,1),NF_ub(:,1),[],opt);
    if exitflag == -2
        xm = NaN;
        fv = NaN;
    end
    if xm == NaN
        fv = inf;
    end
    if fv ~= inf
        if fv < F
            if max(abs(round(xm) - xm))<1.0e-7
                F = fv;
                x = xm;
                tmpNF_lb = NF_lb(:,2:k);
                tmpNF_ub = NF_ub(:,2:k);
                NF_lb = tmpNF_lb;
                NF_ub = tmpNF_ub;
                if isempty(NF_lb) == 0
                    continue;
                else
                    if x ~= NaN
                        fm = F;
                        return;
                    else
                        disp('不存在最优解!');
                        x = NaN;
                        fm = NaN;
                        return;
                    end
                end
            else
                lb1 = NF_lb(:,1);
                ub1 = NF_ub(:,1);
                tmpNF_lb = NF_lb(:,2:k);
                tmpNF_ub = NF_ub(:,2:k);
                NF_lb = tmpNF_lb;
                NF_ub = tmpNF_ub;
                [bArr,index] = find(abs((xm - round(xm)))>=1.0e-7);
                p = bArr(1);
                new_lb = lb1;
                new_ub = ub1;
                new_lb(p) = max(floor(xm(p)) + 1,lb1(p));
                new_ub(p) = min(floor(xm(p)),ub1(p));
                NF_lb = [NF_lb new_lb lb1];
                NF_ub = [NF_ub ub1 new_ub];
                continue;
            end
        else
            tmpNF_lb = NF_lb(:,2:k);
            tmpNF_ub = NF_ub(:,2:k);
            NF_lb = tmpNF_lb;
            NF_ub = tmpNF_ub;
            if isempty(NF_lb) == 0
                continue;
            else
                if x ~= NaN
                    fm = F;
                    return;
                else
                    disp('不存在最优解!');
                    x = NaN;
                    fm = NaN;
                    return;
                end
            end
        end
    else     
        tmpNF_lb = NF_lb(:,2:k);
        tmpNF_ub = NF_ub(:,2:k);
        NF_lb = tmpNF_lb;
        NF_ub = tmpNF_ub;
        if isempty(NF_lb) == 0
            continue;
        else
            if x ~= NaN
                fm = F;
                return;
            else
                disp('不存在最优解!');
                x = NaN;
                fm = NaN;
                return;
            end
        end
    end
end